package cn.kgc.spring08.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author: mosin
 * @version: v1.0  2022/12/6
 * 通知的切面类
 * 切面 = 切点+通知
 */
@Component
@Aspect
@Order(2)   // 设置切面类中通知的执行顺序   order中值小的先执行
public class LogAspect {  //  切面类

    //定义通用的切点表达式
    @Pointcut("execution(public * *(..))")
    //@Pointcut("@annotation(cn.kgc.spring08.annotation.LogAnnotation)")
    public void pointCut(){}

    @Before("pointCut()")  //  前置通知
    public  void beforeAdvice(){
        System.out.println("---------前置通知log日志---------");
    }

    @AfterReturning("pointCut()")  //后置通知  在目标方法正常执行后 执行
    public  void afterReturningAdvice(){
        System.out.println("---------后置通知log日志---------");
    }


    @AfterThrowing("pointCut()")   // 异常通知  目标方法执行时 出现异常后执行
    public  void afterThrowingAdvice(){
        System.out.println("---------异常通知log日志---------");
    }


    @After("pointCut()")   // 最终通知  目标方法不管是否成功执行 该通知都会被增强
    public  void afterAdvice(){
        System.out.println("---------最终通知log日志---------");
    }

    @Around("execution(public * cn.kgc.spring08.entity.*.div(Integer,Integer))")
    public  Object  aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {

        System.out.println("---------环绕前通知log日志---------");
        // 目标方法执行的过程
        Object proceed = joinPoint.proceed();
        System.out.println("---------环绕后通知log日志---------");
        return proceed;
    }

}
